package evs.bsp;

import java.net.URI;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class TestClient {
	
	private Log log = LogFactory.getLog(TestClient.class);
	
	public void printSyntax() {
		System.err.println("Syntax: TestClient ServerURI");
		System.exit(-1);
	}	
	
	public static void main(String[] args) {
		TestClient testClient = new TestClient();
		
		if(args.length != 1)
			testClient.printSyntax();
		
		testClient.runTestSuite(args[0]);
	}
	
	@SuppressWarnings("unchecked")
	public void runTestSuite(String serverUri) {
		
		StudentManagementProxy studentProxy = new StudentManagementProxy();		
		AufgabeManagementProxy aufgabeProxy = new AufgabeManagementProxy();	
		AbgabeSystemProxy abgabeProxy = new AbgabeSystemProxy();
		
		try {
			/*
			 * bind to beispiel server
			 * in this case the async(IAP) server, that supports all 
			 * implemented feautures (brp,activation,identification and iap)
			 */
			studentProxy.bind(new URI(serverUri + "/StudentManagement"));
			aufgabeProxy.bind(new URI(serverUri + "/AufgabeManagement"));
			abgabeProxy.bind(new URI(serverUri + "/AbgabeSystem"));
			
			/*
			 *  create students
			 */
			Student student1 = new Student("0026842", "Attila Lazar");
			Student student2 = new Student("0225650", "Bernhard Wachter");
			Student student3 = new Student("0026843", "Thomas Meindl");
			studentProxy.insert(student1);
			studentProxy.insert(student2);
			studentProxy.insert(student3);
			
			/*
			 * create aufgaben
			 */
			Aufgabe aufgabe1 = new Aufgabe(1, "Doku erweitern");
			Aufgabe aufgabe2 = new Aufgabe(2, "Stundenliste schreiben");
			Aufgabe aufgabe3 = new Aufgabe(3, "Installationsanweisung schreiben");
			Aufgabe aufgabe4 = new Aufgabe(4, "Patterns beschreiben");
			Aufgabe aufgabe5 = new Aufgabe(5, "Testen");
			aufgabeProxy.insert(aufgabe1);
			aufgabeProxy.insert(aufgabe2);
			aufgabeProxy.insert(aufgabe3);
			aufgabeProxy.insert(aufgabe4);
			aufgabeProxy.insert(aufgabe5);
			
			/*
			 * get all students and aufgaben and print them
			 */
			List<Student> students = studentProxy.getAll();					
			List<Aufgabe> aufgaben = aufgabeProxy.getAll();		
			
			for (Student student : students)
				log.info(student.getMatrikelNummer() + " " + student.getName());
			
			for (Aufgabe aufgabe : aufgaben)
				log.info(aufgabe.getNummer() + " " + aufgabe.getBeschreibung());
			
			/*
			 * do Abgaben asynchronosly
			 */
			abgabeProxy.doAbgabe(student1, aufgabe1);
			abgabeProxy.doAbgabe(student1, aufgabe2);
			abgabeProxy.doAbgabe(student1, aufgabe4);
			abgabeProxy.doAbgabe(student1, aufgabe5);
			abgabeProxy.doAbgabe(student2, aufgabe1);
			abgabeProxy.doAbgabe(student2, aufgabe2);
			abgabeProxy.doAbgabe(student2, aufgabe4);
			abgabeProxy.doAbgabe(student3, aufgabe1);
			abgabeProxy.doAbgabe(student3, aufgabe3);
			abgabeProxy.doAbgabe(student3, aufgabe5);
			
			Thread.sleep(1000);
			
			/*
			 * get Abgaben from students and print them
			 */
			List<Aufgabe> abgaben1 = abgabeProxy.getAbgabeFromStudent(student1);
			List<Aufgabe> abgaben2 = abgabeProxy.getAbgabeFromStudent(student2);
			List<Aufgabe> abgaben3 = abgabeProxy.getAbgabeFromStudent(student3);
			
			log.info(student1.getMatrikelNummer() + ": ");
			for (Aufgabe aufgabe : abgaben1)
				log.info(aufgabe);
			
			log.info(student2.getMatrikelNummer() + ": ");
			for (Aufgabe aufgabe : abgaben2)
				log.info(aufgabe);
			
			log.info(student3.getMatrikelNummer() + ": ");
			for (Aufgabe aufgabe : abgaben3)
				log.info(aufgabe);
			
			/*
			 * unbind
			 */
			studentProxy.unbind();
			aufgabeProxy.unbind();
			abgabeProxy.unbind();
		
		} 
		catch (Exception exc) {
			exc.printStackTrace();
			log.error(exc);
		}
	}
}
